package com.itheima;

import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTPayload;
import cn.hutool.jwt.JWTUtil;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.HashMap;
import java.util.Map;

/**
 * @author yunfei
 * @date 2022年10月14日 10:27
 */
@SpringBootTest
public class HutoolJWT {

    @Test
    public void jwtTest(){
        DateTime now = DateTime.now();
        DateTime newTime = now.offsetNew(DateField.SECOND, 15);

        Map<String,Object> payload = new HashMap<String,Object>();
        //签发时间
        payload.put(JWTPayload.ISSUED_AT, now);
        //过期时间
        payload.put(JWTPayload.EXPIRES_AT, newTime);
        //生效时间
        payload.put(JWTPayload.NOT_BEFORE, now);
        //载荷 需要保存到JWT中的用户信息
        payload.put("userName", "zhangsan");
        payload.put("passWord", "666889");

        //加解密的密钥
        String key = "aabb";
        String token = JWTUtil.createToken(payload, key.getBytes());
        System.out.println(token);

        /*
        * eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.
        * eyJwYXNzV29yZCI6IjEyMzQiLCJuYmYiOjE2NjU3MTUyMTEsImV4cCI6MTY2NTcxNTgxMSwidXNlck5hbWUiOiJsaXMiLCJpYXQiOjE2NjU3MTUyMTF9.
        * ywTyKXw2UGiuCfkCVGpzzG0pP4Su2PTZ3orAdgiOZ-Q
        *
        * 第一段:  保存的是当前JWT的头信息 里面定义了JWT的加密算法 版本号 这一部分可以省略不写 会使用Base64编码自动生成
        * 第二段:  保存的是用户登录的信息(自己往Token中塞的信息) 而这一段也是没有加密的 只是通过Base64编码
        * 第三段:  保存的是 HS256加密算法(第一段+第二段+密钥) = 密文  起到校验的作用
        *
        * 不能明文传输
        * 使用JWT的话 账号密码等信息依然相当于是明文传输  怎么办 ??
        * 所以我们如果使用的JWT 第二部分中不能传输敏感信息  只要传输一个能唯一标记一个用户的信息就可以了  主键
        *
        * Token安全吗 ??
        * 能不能被篡改 ??  不能
        * 别人抓包拿到你的Token 他可以使用吗 ??  可以
        *
        *
        * Base64编码: 不是加密算法 就算一种普通的编码格式
        *
        * */
        System.out.println("----------------------------------------------------------------------------------------------------");

        /*判断一个Token是否合法 如果返回false  异常  如果抛出错误 异常 */
        String token2 = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwYXNzV29yZCI6IjY2Njg4OSIsIm5iZiI6MTY2NTcxNjkxMCwiZXhwIjoxNjY1NzE2OTI1LCJ1c2VyTmFtZSI6InpoYW5nc2FuIiwiaWF0IjoxNjY1NzE2OTEwfQ.y3qYdqUDLkjxO1woHXudZeXcI11BKwIAIIsevQKuhWY";
        JWT jwt = JWTUtil.parseToken(token2);
        // 使用加解密密钥去解密Token
        // 如果密钥错误 或者 Token中途被篡改 这个解密都会失败
        boolean verifyKey = jwt.setKey(key.getBytes()).verify();
        System.out.println(verifyKey);
        // 判断Token是否过期
        boolean verifyTime = jwt.validate(0);
        System.out.println(verifyTime);
    }
}
